import java.io.*;
import java.util.ArrayList;
import java.util.List;

/*
    1、参与序列化和反序列化的对象，必须实现Serializable接口
    2、Serializable接口只是一个标志接口
    public interface Serializable {
    }
    这个接口当中没有代码
    作用：
        起到标识的作用，标志的作用，java虚拟机看到这个类实现了这个接口，会对这个类特殊待遇
        Serializable这个标志接口是给java虚拟机参考的，java虚拟机看到这个借口之后，会为该类自动生成一个序列化版本号

        序列化版本号有什么用？
            Student class重新编译后会生成新的序列化版本号，此时再读取的话出错，因为版本号发生改变

            java语言区分类机制：
                第一：类名
                第二：序列化版本号

            自动生成一个序列化版本号的缺陷：
                一旦代码确定，不能进行后续的修改，修改必然重新编译，必然生成新的序列化版本号，这时候java虚拟机会认为这个是一个全新的类

            最终结论：凡是一个类实现了Serializable接口，建议给该类提供一个固定不变的序列化版本号，这样即使这个类的代码改了，但是版本号不变，java会认为是同一个类

    3、一次序列化多个对象呢？
        可以，可以将对象放到集合当中，序列化集合
        提示：参与序列化的ArrayList集合以及集合中的元素都需要实现Serializable接口


 */
public class ObjectOutputStreamTest01 {
    public static void main(String[] args) throws IOException {
        //创建java对象
        Student s = new Student(1020010530,"文梦甜");
        //序列化
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("chapter21\\students"));
        //序列化对象
        oos.writeObject(s);
        //刷新
        oos.flush();
        //关闭
        oos.close();

        //***************************************序列化多个对象
        List<Student> studentList = new ArrayList<>();
        studentList.add(new Student(1020010307,"王强"));
        studentList.add(new Student(1020010530,"文梦甜"));
        studentList.add(new Student(1020010001,"王小绕"));
        ObjectOutputStream oos1 = new ObjectOutputStream(new FileOutputStream("chapter21\\students1"));
        oos1.writeObject(studentList);
        oos1.flush();
        oos1.close();

    }

}

class Student implements Serializable {   //对Student  Alt + 回车  可以自动生成序列化版本号
    private static final long serialVersionUID = 2227032590823316582L;
    private int no;
    //private transient String name; //transient关键字表示游离的，不参与序列化，即name不参与序列化
    private String name;
    //private static final long serialVersionUID = -6849794470754667710L;   String的序列化版本号
    //private static final long serialVersionUID = 1L;

    public Student() {
    }

    public Student(int no, String name) {
        this.no = no;
        this.name = name;
    }

    public int getNo() {
        return no;
    }

    public void setNo(int no) {
        this.no = no;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Student{" +
                "no=" + no +
                ", name='" + name + '\'' +
                '}';
    }
}